package com.knife.lov.domain.service;

import com.knife.lov.infra.constants.CodeValueSupportType;
import lombok.extern.slf4j.Slf4j;

/**
 * 2022-02-24 将LovCacheAble 修改为抽象类；由于selectMeaning方法在已有的实现类中使用了ThreadLocal，需要再翻译之后清除缓存，就必须要调用clear方法；
 * 为了避免调用者使用该selectMeaning方法并忘记调用clear方法，故将两个方法整合进selectMeaningWithClear，并且只暴露这一个接口方法给外部调用
 *
 * @author tianhao.luo@hand-china.com
 * @date 2021年11月15日 10:55 上午
 */
@Slf4j
public abstract class KnifeAbstractLovCacheAble {

    /**
     * 翻译
     *
     * @param lovCode              lov编码
     * @param source               lovValue
     * @param codeValueSupportType 取值集中维护的哪个字段
     * @return 翻译后结果
     * @author tianhao.luo@hand-china.com
     * @date 2021/11/15 10:56 上午
     */
    protected abstract String selectMeaning(String lovCode, String source, CodeValueSupportType codeValueSupportType);


    /**
     * 清除本地缓存
     *
     * @description
     * @version 1.0
     * @author tianhao.luo@hand-china.com
     * @date 2021/12/15 7:33 下午
     * @since 1.0
     */
    protected abstract void clear();


    /**
     * 获取值集翻译时清除缓存，此方法用于同一个线程中翻译同一个值集的不同属性时，数据异常的问题
     *
     * @param lovCode              lov编码
     * @param source               lovValue
     * @param codeValueSupportType 取值集中维护的哪个字段
     * @return 翻译后结果
     * @description
     * @version 1.0
     * @author tianhao.luo@hand-china.com
     * @date 2021/12/15 7:34 下午
     * @since 1.0
     */
    public String selectMeaningWithClear(String lovCode, String source, CodeValueSupportType codeValueSupportType) {
        try {
            log.debug("进行值集翻译");
            return selectMeaning(lovCode, source, codeValueSupportType);
        } finally {
            clear();
            log.debug("值集翻译本地缓存已清除");
        }
    }
}
